#define _GNU_SOURCE
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sched.h>
#include <sys/wait.h>
#include <sys/types.h>
#include <signal.h>
// 线程栈大小 (4KB)
#define STACK_SIZE 4096

int laotang = 10;

void i() {}
void cal() { i(); }
void h() { cal(); }
// 线程 B 的代码路径
int g_func(void *args) {
    h();
    laotang = 19;
    return 0;
}


void k() { write(1, "data", 4); }
// 线程 C 的代码路径
int o_func(void *args) {
    k();
    laotang = 90;
    return 0;
}

void b() {read(...)}
void a() {b()}

int main() {
    laotang = 10;
    // 为两个线程分配栈空间
    char *stack1 = malloc(STACK_SIZE);
    char *stack2 = malloc(STACK_SIZE);

    printf("主线程: 开始执行 (PID: %d)\n", getpid());

    // 克隆第一个线程
    // CLONE_VM: 共享虚拟地址空间
    // CLONE_FS: 共享文件系统信息
    // CLONE_FILES: 共享文件描述符表
    // CLONE_SIGHAND: 共享信号处理函数
    // CLONE_THREAD: 创建线程
    pid_t tid1 = clone(g_func, stack1 + STACK_SIZE,
                      CLONE_VM | CLONE_FS | CLONE_FILES | CLONE_SIGHAND | CLONE_THREAD,
                      NULL);

    // 克隆第二个线程
    pid_t tid2 = clone(o_func, stack2 + STACK_SIZE,
                      CLONE_VM | CLONE_FS | CLONE_FILES | CLONE_SIGHAND | CLONE_THREAD,
                      NULL);

    printf("主线程: 创建了两个线程 (TID1: %d, TID2: %d)\n", tid1, tid2);

    // 主线程的代码路径
    a();

    // 释放栈空间
    free(stack1);
    free(stack2);

    return 0;
}
